package 变长滑动窗口2

// 核心:窗口内外 的cnt统计
func balancedString(s string) int {
	cnt := [256]int{}
	for _, c := range s {
		cnt[c]++
	}
	m := len(s) / 4
	if cnt['Q'] == m && cnt['W'] == m && cnt['E'] == m && cnt['R'] == m {
		return 0 // 已经符合要求啦
	}
	ans := len(s)
	left := 0
	for i, c := range s {
		cnt[c]--
		for cnt['Q'] <= m && cnt['W'] <= m && cnt['E'] <= m && cnt['R'] <= m {
			ans = min(ans, i-left+1)
			cnt[s[left]]++
			left++ // 缩小子串
		}
	}
	return ans
}

//题意 窗口长度!!!需要考虑子串的连续性
//func balancedString(s string) (ans int) {
//	n := len(s) / 4
//	q := strings.Count(s, "Q")
//	w := strings.Count(s, "W")
//	e := strings.Count(s, "E")
//	r := strings.Count(s, "R")
//	if q == n && w == n && e == n && r == n {
//		return 0
//	}
//	if q > n {
//		ans += q - n
//	}
//	if w > n {
//		ans += w - n
//	}
//	if e > n {
//		ans += e - n
//	}
//	if r > n {
//		ans += r - n
//	}
//	return
//}
